#ifndef LED_MANAGER_H
#define LED_MANAGER_H

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>

// LED状态枚举
enum LEDStatus {
  LED_OFF,              // 关闭
  LED_STARTUP,          // 启动状态
  LED_INITIALIZING,     // 初始化中
  LED_WIFI_CONNECTING,  // WiFi连接中
  LED_WIFI_CONNECTED,   // WiFi已连接
  LED_WIFI_FAILED,      // WiFi连接失败
  LED_IDLE,             // 待机状态
  LED_HOMING,           // 归零中
  LED_DRAWING,          // 绘图中
  LED_PAUSED,           // 暂停状态
  LED_COMPLETED,        // 完成状态
  LED_ERROR,            // 错误状态
  LED_MAINTENANCE,      // 维护状态
  LED_EMERGENCY         // 紧急停止
};

// LED效果模式枚举
enum LEDEffectMode {
  EFFECT_SOLID,         // 纯色
  EFFECT_BREATH,        // 呼吸灯
  EFFECT_BLINK,         // 闪烁
  EFFECT_RAINBOW,       // 彩虹
  EFFECT_FIRE,          // 火焰效果
  EFFECT_WAVE,          // 波浪效果
  EFFECT_METEOR,        // 流星效果
  EFFECT_PROGRESS,      // 进度条
  EFFECT_SPARKLE,       // 闪烁星星
  EFFECT_THEATER_CHASE, // 跑马灯
  EFFECT_POLAR_TRACK    // 极坐标追踪
};

// LED颜色定义
struct LEDColor {
  uint8_t r, g, b;
  LEDColor(uint8_t red = 0, uint8_t green = 0, uint8_t blue = 0) : r(red), g(green), b(blue) {}
};

class LEDManager {
private:
  uint8_t statusLedPin;
  uint8_t ws2812Pin;
  uint16_t numLeds;
  
  Adafruit_NeoPixel* strip;
  
  LEDStatus currentStatus;
  LEDEffectMode currentEffect;
  unsigned long lastUpdate;
  unsigned long blinkInterval;
  bool ledState;
  uint8_t breathValue;
  bool breathDirection;
  
  // 功能开关
  bool ws2812Enabled;
  bool statusLedEnabled;
  uint8_t globalBrightness;
  
  // 效果参数 - 优化内存使用
  uint16_t rainbowOffset;
  uint8_t* fireHeat;      // 动态分配，根据实际LED数量
  int meteorPos;
  uint8_t theaterStep;
  
  // 颜色方案
  LEDColor colorOff;
  LEDColor colorStartup;
  LEDColor colorInitializing;
  LEDColor colorWifiConnecting;
  LEDColor colorWifiConnected;
  LEDColor colorWifiFailed;
  LEDColor colorIdle;
  LEDColor colorHoming;
  LEDColor colorDrawing;
  LEDColor colorPaused;
  LEDColor colorCompleted;
  LEDColor colorError;
  LEDColor colorEmergency;
  
  // 内部方法
  void updateStatusLED();
  void updateWS2812();
  void setStripColor(LEDColor color, uint8_t brightness = 255);
  void setStripRange(int start, int end, LEDColor color, uint8_t brightness = 255);
  void setProgressBar(float progress, LEDColor color);
  
  // 基础效果
  void breathEffect(LEDColor color);
  void blinkEffect(LEDColor color, unsigned long interval);
  void solidEffect(LEDColor color);
  
  // 绘图专用效果方法已合并到通用效果方法中
  
  // 炫酷效果
  void rainbowEffect();
  void fireEffect();
  void waveEffect(LEDColor color);
  void meteorEffect(LEDColor color);
  void sparkleEffect(LEDColor color);
  void theaterChaseEffect(LEDColor color);
  void polarTrackEffect(LEDColor color);
  
  // 辅助方法
  uint32_t wheel(byte wheelPos);
  LEDColor heatColor(uint8_t heat);
  void fadeToBlack(int ledNo, byte fadeValue);
  void setPolarPosition(float theta, float rho);
  const char* getStatusName(LEDStatus status);
  
  // 绘图专用设置
  LEDEffectMode drawingEffectMode;
  LEDColor drawingColor;
  uint8_t drawingBrightness;
  uint8_t drawingSpeed;
  unsigned long drawingEffectInterval;
  bool drawingSessionActive;  // 绘图会话状态标志
  
  // 临时颜色提示状态
  bool temporaryColorActive;     // 是否正在显示临时颜色
  LEDColor temporaryColor;       // 临时颜色
  uint8_t temporaryBrightness;   // 临时亮度
  
  // 实时位置跟踪（按照附件验证方案）
  float currentTheta;            // 当前角度
  float currentRho;              // 当前半径
  
  void updateDrawingEffects();
  
public:
  LEDManager(uint8_t statusPin, uint8_t stripPin, uint16_t ledCount = 144);
  ~LEDManager();
  
  void begin();
  void update();
  void setStatus(LEDStatus status);
  void setProgress(float progress);  // 0.0 - 1.0
  void setCustomColor(LEDColor color, uint8_t brightness = 255);
  void clear();
  void test();
  
  // 功能开关控制
  void enableWS2812(bool enable);
  void enableStatusLed(bool enable);
  void setGlobalBrightness(uint8_t brightness);  // 0-255
  bool isWS2812Enabled() const { return ws2812Enabled; }
  bool isStatusLedEnabled() const { return statusLedEnabled; }
  
  // 效果模式控制
  void setEffectMode(LEDEffectMode mode);
  LEDEffectMode getEffectMode() const { return currentEffect; }
  
  // 状态查询
  LEDStatus getStatus() const { return currentStatus; }
  uint8_t getGlobalBrightness() const { return globalBrightness; }
  
  // 绘图会话管理
  void startDrawingSession();    // 开始绘图会话
  void endDrawingSession();      // 结束绘图会话
  bool isInDrawingSession() const { return drawingSessionActive; }
  
  // 设置灯带数量（运行时修改）
  void setLedCount(uint16_t count);
  
  // 绘图专用灯光效果设置
  void setDrawingEffect(LEDEffectMode mode, LEDColor color = LEDColor(50, 150, 255));
  void setDrawingBrightness(uint8_t brightness);
  void setDrawingSpeed(uint8_t speed);  // 效果播放速度 1-10
  
  // 获取当前绘图灯光设置
  LEDEffectMode getDrawingEffect() const { return drawingEffectMode; }
  LEDColor getDrawingColor() const { return drawingColor; }
  uint8_t getDrawingBrightness() const { return drawingBrightness; }
  uint8_t getDrawingSpeed() const { return drawingSpeed; }
  
  // 临时状态提示（用于按键反馈）
  void setTemporaryColor(LEDColor color, uint8_t brightness = 255);
  void clearTemporaryColor();
  
  // 智能状态更新已移至 LEDControlCenter (业务逻辑层)
  
  // 实时位置更新（按照附件验证方案）
  void updatePosition(float theta, float rho);
  
  // 健康检查和维护方法
  bool isWS2812Healthy();     // 检查WS2812灯带健康状态
  void resetWS2812();         // 重置WS2812灯带
  void safeShutdown();        // 安全关闭LED系统
};

#endif // LED_MANAGER_H
